typescriptで、ある時間が特定の時間の範囲内かどうか調べる関数を作成したので公開します。

関数の中身はこちら。

ソースコード

TimeUtil.ts
function isBetween(checkTime: string, startTime?: string, endTime?: string): boolean {
    // 時間の正規表現
    const regexp = new RegExp(/^([01][0-9]|2[0-3]):([0-5][0-9])$/)

    // check time validate
    if (checkTime == null || !regexp.test(checkTime)) return false
    const checkExec = regexp.exec(checkTime)
    if (checkExec == null) return false

    const checkHour = Number(checkExec[1])
    const checkMinutes = Number(checkExec[2])

    // 開始時間、終了時間指定
    if (startTime && endTime) {
      // validate
      if (!regexp.test(String(startTime)) || !regexp.test(endTime)) return false
      const startExec = regexp.exec(startTime)
      const endExec = regexp.exec(endTime)
      if (startExec == null || endExec == null) return false

      const startHour = Number(startExec[1])
      const startMinutes = Number(startExec[2])
      const endHour = Number(endExec[1])
      const endMinutes = Number(endExec[2])

      // 時間のチェック
      if (startHour <= checkHour && checkHour < endHour) return true
      return (
        (startHour === checkHour || endHour === checkHour) &&
        startMinutes <= checkMinutes &&
        checkMinutes <= endMinutes
      )

      // 開始時間のみ指定
    } else if (startTime) {
      // validate
      if (!regexp.test(startTime)) return false
      const startExec = regexp.exec(startTime)
      if (startExec == null) return false

      const startHour = Number(startExec[1])
      const startMinutes = Number(startExec[2])

      // 時間のチェック
      if (startHour < checkHour) return true
      return startHour === checkHour && startMinutes <= checkMinutes

      // 終了時間のみ指定
    } else if (endTime) {
      // validate
      if (!regexp.test(endTime)) return false
      const endExec = regexp.exec(endTime)
      if (endExec == null) return false

      const endHour = Number(endExec[1])
      const endMinutes = Number(endExec[2])

      // 時間のチェック
      if (checkHour < endHour) return true
      return checkHour === endHour && checkMinutes <= endMinutes
    }

    return false
  }

時間の書式はHH:mmになります。

checkTimeが確認したい時間、 startTimeは時間の範囲の開始時間、 endTimeは時間の範囲の終了時間。

startTimeのみ指定の場合は、checkTimeがstartTime以降かどうか。 endTimeのみ指定の場合は、checkTimeがendTime以前かどうかという判定になります。

テストコード

テストコードはこちらになります。

TimeUtil.test.ts
/**
 * isBetweenのテスト
 */
describe('TimeUtil isBetweenのテスト', () => {
  test('startTime & endTime', () => {
    const startTime = '09:00'
    const endTime = '17:00'

    expect(isBetween('01:00', startTime, endTime)).toBe(false)
    expect(isBetween('01:25', startTime, endTime)).toBe(false)
    expect(isBetween('01:50', startTime, endTime)).toBe(false)

    expect(isBetween('08:57', startTime, endTime)).toBe(false)
    expect(isBetween('08:58', startTime, endTime)).toBe(false)
    expect(isBetween('08:59', startTime, endTime)).toBe(false)
    expect(isBetween('09:00', startTime, endTime)).toBe(true)
    expect(isBetween('09:01', startTime, endTime)).toBe(true)
    expect(isBetween('09:02', startTime, endTime)).toBe(true)

    expect(isBetween('16:57', startTime, endTime)).toBe(true)
    expect(isBetween('16:58', startTime, endTime)).toBe(true)
    expect(isBetween('16:59', startTime, endTime)).toBe(true)
    expect(isBetween('17:00', startTime, endTime)).toBe(true)
    expect(isBetween('17:01', startTime, endTime)).toBe(false)
    expect(isBetween('17:02', startTime, endTime)).toBe(false)
    expect(isBetween('17:03', startTime, endTime)).toBe(false)

    expect(isBetween('23:00', startTime, endTime)).toBe(false)
    expect(isBetween('23:20', startTime, endTime)).toBe(false)
    expect(isBetween('23:40', startTime, endTime)).toBe(false)
  })

  test('startTime only', () => {
    const startTime = '09:00'

    expect(isBetween('00:00', startTime)).toBe(false)
    expect(isBetween('00:30', startTime)).toBe(false)
    expect(isBetween('08:00', startTime)).toBe(false)
    expect(isBetween('08:30', startTime)).toBe(false)

    expect(isBetween('08:59', startTime)).toBe(false)
    expect(isBetween('09:00', startTime)).toBe(true)
    expect(isBetween('09:01', startTime)).toBe(true)

    expect(isBetween('18:00', startTime)).toBe(true)
    expect(isBetween('18:15', startTime)).toBe(true)
    expect(isBetween('18:30', startTime)).toBe(true)
  })

  test('endTime only', () => {
    const endTime = '17:00'

    expect(isBetween('09:00', undefined, endTime)).toBe(true)
    expect(isBetween('09:20', undefined, endTime)).toBe(true)
    expect(isBetween('09:40', undefined, endTime)).toBe(true)

    expect(isBetween('16:59', undefined, endTime)).toBe(true)
    expect(isBetween('17:00', undefined, endTime)).toBe(true)
    expect(isBetween('17:01', undefined, endTime)).toBe(false)

    expect(isBetween('18:00', undefined, endTime)).toBe(false)
    expect(isBetween('18:20', undefined, endTime)).toBe(false)
    expect(isBetween('18:40', undefined, endTime)).toBe(false)
  })
})

以上でした!